Лабораторная работа №1

Подготовка стенда и модель экспоненциального роста

Алина Тарасова

Российский университет дружбы народов

2026-02-20


---

## Докладчик

:::::::::::::: {.columns align=center}
::: {.column width="70%"}

  * Алина Тарасова
  * студент
  * Российский университет дружбы народов им. П. Лумумбы
  * [destinyshesaid@yandex.ru](mailto:destinyshesaid@yandex.ru)
  * GitHub: @aatarasovaa

:::
::: {.column width="30%"}

![](./image/avatar.jpg)

:::
::::::::::::::

---

# Вводная часть

## Актуальность

- Имитационное моделирование — важный инструмент исследования сложных систем
- Необходимость воспроизводимости научных результатов
- Современные требования к организации вычислительных экспериментов
- Потребность в интеграции кода, данных и отчётов

## Объект и предмет исследования

- **Объект:** Процесс имитационного моделирования
- **Предмет:** 
  - Модель экспоненциального роста
  - Инструменты для организации научных проектов
  - Методы литературного программирования

## Цели и задачи

### Цель работы

Исследование модели экспоненциального роста $\frac{du}{dt} = \alpha u$ с использованием современных инструментов организации научных проектов

### Задачи

1. Настроить рабочее окружение (Git, SSH, PGP, Git-flow)
2. Освоить методологию литературного программирования
3. Изучить фреймворк DrWatson.jl
4. Реализовать базовую модель экспоненциального роста
5. Провести параметрическое исследование
6. Создать отчёт и презентацию с использованием Quarto

---

# Настройка рабочего окружения

## Система контроля версий Git

### Базовая конфигурация

```bash
# Настройка пользователя
git config --global user.name "Алина Тарасова"
git config --global user.email "destinyshesaid@yandex.ru"

# Настройка ветки по умолчанию
git config --global init.defaultBranch master

# Настройка переносов строк
git config --global core.autocrlf input
git config --global core.safecrlf warn

Создание ключей

SSH-ключ

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519-git -C "destinyshesaid@yandex.ru"

PGP-ключ (для подписи коммитов)

gpg --full-generate-key  # RSA 4096 бит
gpg --list-secret-keys --keyid-format LONG
gpg --armor --export D17BA68B48151B6E  # экспорт ключа

PGP ключ на GitHub

Git-flow и Conventional Commits

Установка инструментов

# Установка git-flow
sudo apt install git-flow -y

# Установка pnpm
curl -fsSL https://get.pnpm.io/install.sh | sh -
source ~/.bashrc

# Установка инструментов для коммитов
pnpm add -g commitizen cz-customizable standard-version

Инициализация Git-flow

git flow init  # префикс тегов: v
git flow release start 1.0.0
standard-version --first-release
git flow release finish 1.0.0
git push --all
git push --tags

Рабочее пространство

Структура каталогов по стандарту Denote

~/work/study/2026-1/
└── 2026-1==study--simulation-modeling/
    └── 2026-1--study--simulation-modeling/
        ├── labs/
           └── lab01/
               └── project/
                   ├── src/          # исходный код
                   ├── scripts/       # исполняемые скрипты
                   ├── data/          # данные
                   ├── plots/         # графики
                   └── notebooks/     # Jupyter notebooks
        ├── report/                     # отчёт
        └── presentation/                # презентация

Создание проекта DrWatson

Инициализация проекта

using DrWatson
initialize_project("project"; authors="Алина Тарасова", git=false)

Установка пакетов

packages = [
    "DrWatson",           # организация проектов
    "DifferentialEquations", # решение ОДУ
    "Plots",              # визуализация
    "DataFrames",         # работа с данными
    "Literate",           # литературное программирование
    "IJulia",             # интеграция с Jupyter
    "BenchmarkTools",     # оценка производительности
    "Quarto"              # создание отчётов
]

Pkg.add(packages)  # время установки: ~30 минут

Литературное программирование

Концепция Literate.jl

Основные принципы [стр. 27-29]

  • Строки, начинающиеся с #, интерпретируются как Markdown
  • Остальные строки — исполняемый код на Julia
  • Возможность генерации различных форматов

Пример литературного кода

# # Экспоненциальный рост
#
# Уравнение модели:
# $$ \frac{du}{dt} = \alpha u $$

function exponential_growth!(du, u, p, t)
    α = p
    du[1] = α * u[1]
end

Генерация производных форматов

Скрипт tangle.jl [стр. 74-75]

julia --project=. scripts/tangle.jl scripts/01_exponential_growth.jl

Результаты генерации

Чистый скрипт: scripts/01_exponential_growth/01_exponential_growth.jl
Quarto: markdown/01_exponential_growth/01_exponential_growth.qmd
Notebook: notebooks/01_exponential_growth/01_exponential_growth.ipynb

Модель экспоненциального роста

Теоретическое описание [стр. 69-70]

Дифференциальное уравнение

\[ \frac{du}{dt} = \alpha u, \quad u(0) = u_0 \]

Аналитическое решение

\[ u(t) = u_0 e^{\alpha t} \]

Время удвоения

\[ T_2 = \frac{\ln 2}{\alpha} \]

Параметры модели

Параметр Обозначение Значение
Скорость роста \(\alpha\) 0.3
Начальная популяция \(u_0\) 1.0
Время моделирования \(t_{max}\) 10.0

Реализация базовой модели

Код модели [стр. 71-72]

using DifferentialEquations, Plots, DataFrames

function exponential_growth!(du, u, p, t)
    α = p
    du[1] = α * u[1]
end

# Параметры
u0 = [1.0]
α = 0.3
tspan = (0.0, 10.0)

# Решение ОДУ
prob = ODEProblem(exponential_growth!, u0, tspan, α)
sol = solve(prob, Tsit5(), saveat=0.1)

# Создание DataFrame
df = DataFrame(t=sol.t, u=first.(sol.u))

Результаты базовой модели

График экспоненциального роста

Базовая модель: α = 0.3

Численные результаты

Первые 5 строк результатов:
 Row │ t        u
─────┼────────────────────
   1 │ 0.0      1.0
   2 │ 0.1      1.03045
   3 │ 0.2      1.06184
   4 │ 0.3      1.09417
   5 │ 0.4      1.1275

Время удвоения: 2.31

Параметрическое исследование

Настройка параметров [стр. 77-78]

Сетка параметров

param_grid = Dict(
    :α => [0.1, 0.3, 0.5, 0.8, 1.0],
    :u0 => [[1.0]],
    :tspan => [(0.0, 10.0)]
)

all_params = dict_list(param_grid)
println("Всего комбинаций: ", length(all_params))

Функция для запуска эксперимента

function run_single_experiment(params::Dict)
    @unpack u0, α, tspan = params
    prob = ODEProblem(exponential_growth!, u0, tspan, (α=α,))
    sol = solve(prob, Tsit5(), saveat=0.1)
    doubling_time = log(2) / α
    return Dict(
        "time_points" => sol.t,
        "population_values" => first.(sol.u),
        "doubling_time" => doubling_time
    )
end

Сравнение траекторий

Влияние параметра α на рост популяции

Сравнение различных значений α

Наблюдения: - Чем больше α, тем быстрее рост - При α = 1.0 популяция растёт в ~2.7 раза быстрее, чем при α = 0.3 - Все кривые имеют экспоненциальный характер

Зависимость времени удвоения от α

Теоретическая кривая и численные результаты

Время удвоения

Сравнение теории и эксперимента

α Теоретическое \(T_2\) Численное \(T_2\) Погрешность
0.1 6.93 6.93 0.0%
0.3 2.31 2.31 0.0%
0.5 1.39 1.39 0.0%
0.8 0.87 0.87 0.0%
1.0 0.69 0.69 0.0%

Оценка производительности

Бенчмаркинг

using BenchmarkTools

for α_value in [0.1, 0.3, 0.5, 0.8, 1.0]
    prob = ODEProblem(exponential_growth!, [1.0], (0.0, 10.0), α_value)
    b = @benchmark solve($prob, Tsit5(), saveat=0.1) samples=100
    println("α = $α_value: ", median(b).time/1e6, " ms")
end

Результаты

Время вычисления

Вывод: Время вычисления практически не зависит от параметра α.

Интеграция с Jupyter и Quarto

Jupyter Notebook

Установка и запуск

# Установка Jupyter через pipx
sudo apt install pipx -y
pipx ensurepath
source ~/.bashrc
pipx install jupyter

# Запуск
jupyter notebook --no-browser --ip=0.0.0.0

Результат в браузере Windows

Jupyter Notebook

Создание отчёта в Quarto

Структура отчёта [стр. 76, 84]

---
title: "Лабораторная работа №1"
subtitle: "Модель экспоненциального роста"
author: "Алина Тарасова"
---

# Введение
# Теоретическое описание
# Модель экспоненциального роста

**Цель:** Исследовать решение уравнения $\frac{du}{dt} = \alpha u$.

Экспоненциальный рост — это процесс увеличения величины, при котором
скорость роста пропорциональна текущему значению [стр. 69].

## Инициализация проекта и загрузка пакетов

::: {#21d3a44c .cell}
``` {.julia .cell-code}
using DrWatson
@quickactivate "project"

using DifferentialEquations
using Plots
using DataFrames
using JLD2

:::

Определение модели

Уравнение экспоненциального роста:

\frac{du}{dt} = \alpha u, \quad u(0) = u_0
function exponential_growth!(du, u, p, t)
    α = p
    du[1] = α * u[1]
end

Первый запуск с параметрами по умолчанию

Зададим начальные параметры: - \(u_0 = [1.0]\) — начальная популяция - \(\alpha = 0.3\) — скорость роста - \(t \in [0, 10]\) — временной интервал

u0 = [1.0]
α = 0.3
tspan = (0.0, 10.0)

Создадим и решим задачу:

prob = ODEProblem(exponential_growth!, u0, tspan, α)
sol = solve(prob, Tsit5(), saveat=0.1)

Визуализация результатов

Построим график решения:

plot(sol,
     label="u(t)",
     xlabel="Время t",
     ylabel="Популяция u",
     title="Экспоненциальный рост (α = $α)",
     lw=2,
     legend=:topleft)

Сохраним график в папку plots:

savefig(plotsdir("exponential_growth_α=$α.png"))

Анализ результатов

Создадим таблицу с данными:

df = DataFrame(t=sol.t, u=first.(sol.u))
println("Первые 5 строк результатов:")
println(first(df, 5))

Вычислим время удвоения популяции: Время удвоения вычисляется по формуле \(T_2 = \ln(2)/\alpha\) [стр. 70].

u_final = last(sol.u)[1]
doubling_time = log(2) / α
println("\nАналитическое время удвоения: ", round(doubling_time; digits=2))

Сохранение результатов

Сохраним все данные для последующего анализа:

@save datadir("exponential_growth_results.jld2") df

Параметрическое исследование

Параметрическое исследование экспоненциального роста

Активация проекта и загрузка пакетов

ИЗМЕНЕНИЕ: Добавлен DrWatson для управления проектом и параметрами

using DrWatson
@quickactivate "project" # Активация проекта DrWatson
using DifferentialEquations
using DataFrames
using Plots
using JLD2
using BenchmarkTools

Установка каталогов

script_name = splitext(basename(PROGRAM_FILE))[1]
mkpath(plotsdir(script_name))
mkpath(datadir(script_name))

Определение модели

Модель: 𝑑𝑢/𝑑𝑡 = 𝛼 ⋅ 𝑢

function exponential_growth!(du, u, p, t)
α = p.α # **ИЗМЕНЕНИЕ:** Параметры теперь передаются как

именованный кортеж

    du[1] = α * u[1]
end

Определение параметров в Dict

ОСНОВНОЕ ИЗМЕНЕНИЕ: Все параметры собраны в Dict для

 #систематизации

Базовый набор параметров (один эксперимент)

base_params = Dict(
:u0 => [1.0], # начальная популяция
:α => 0.3, # скорость роста
:tspan => (0.0, 10.0), # интервал времени:solver => Tsit5(), # метод решения
:saveat => 0.1, # шаг сохранения результатов
:experiment_name => "base_experiment"
)
println("Базовые параметры эксперимента:")
for (key, value) in base_params
println(" $key = $value")
end

Функция-обертка для запуска одного эксперимента

ИСПРАВЛЕНИЕ: Возвращаем Dict со строковыми ключами

function run_single_experiment(params::Dict)
@unpack u0, α, tspan, solver, saveat = params
prob = ODEProblem(exponential_growth!, u0, tspan, (α=α,)) #
 Создаем и решаем задачу
sol = solve(prob, solver; saveat=saveat)
final_population = last(sol.u)[1] # Анализ результатов
doubling_time = log(2) / α
return Dict(
"solution" => sol,
"time_points" => sol.t,
"population_values" => first.(sol.u),
"final_population" => final_population,
"doubling_time" => doubling_time,
"parameters" => params # Сохраняем исходные параметры
) # Используем строки как ключи для совместимости с DrWatson
end

Запуск базового эксперимента

ИЗМЕНЕНИЕ: Используем produce_or_load для автоматического

 кэширования
data, path = produce_or_load(
datadir(script_name, "single"), # Папка для сохранения
base_params, # Параметры эксперимента
run_single_experiment, # Функция для выполнения
prefix = "exp_growth", # Префикс имени файла
tag = false, # Не добавлять git-тег
verbose = true
)
println("\nРезультаты базового эксперимента:")
println(" Финальная популяция: ", data["final_population"])
println(" Время удвоения: ", round(data["doubling_time"]; digits=2))
println(" Файл результатов: ", path)

Визуализация базового эксперимента

p1 = plot(data["time_points"], data["population_values"],
label="α = $(base_params[:α])",
xlabel="Время, t",
ylabel="Популяция, u(t)",
title="Экспоненциальный рост (базовый эксперимент)",
lw=2,
legend=:topleft,
grid=true
)

Сохраним график в папку plots

savefig(plotsdir(script_name, "single_experiment.png"))

Параметрическое сканирование

НОВАЯ СЕКЦИЯ: Исследование влияния параметра α Сетка параметров для сканирования

param_grid = Dict(
:u0 => [[1.0]], # фиксируем начальное условие
:α => [0.1, 0.3, 0.5, 0.8, 1.0], # исследуемые значения скорости
 роста
:tspan => [(0.0, 10.0)], # фиксируем интервал времени
:solver => [Tsit5()], # фиксируем метод решения
:saveat => [0.1], # фиксируем шаг сохранения
:experiment_name => ["parametric_scan"]
)

Генерация всех комбинаций параметров

all_params = dict_list(param_grid)
println("\n" * "="^60)
println("ПАРАМЕТРИЧЕСКОЕ СКАНИРОВАНИЕ")
println("Всего комбинаций параметров: ", length(all_params))
println("Исследуемые значения α: ", param_grid[:α])
println("="^60)

Запуск всех экспериментов и собор результатов

НОВАЯ СЕКЦИЯ: Автоматический запуск и сохранение всех вариантов

all_results = []
all_dfs = []
for (i, params) in enumerate(all_params)
println("Прогресс: $i/$(length(all_params)) | α = $(params[:α])")
data, path = produce_or_load(
datadir(script_name, "parametric_scan"), # Данные
params, # Текущий набор параметров
run_single_experiment, # Функция для выполнения
prefix = "scan", # Префикс имени файла
tag = false,
verbose = false # Не выводить подробности для
 каждого запуска
) # Автоматическое сохранение/загрузка каждого эксперимента
result_summary = merge(
params,
Dict(
:final_population => data["final_population"],
:doubling_time => data["doubling_time"],
:filepath => path # Путь к сохраненным данным
)
) # Сохраняем сводные результаты (используем символы для
 параметров, но данные из data - строки)
push!(all_results, result_summary)
df = DataFrame(
t = data["time_points"],
u = data["population_values"],
α = fill(params[:α], length(data["time_points"]))
) # Сохраняем полные данные для визуализации
push!(all_dfs, df)
end

Анализ и визуализация результатов сканирования

НОВАЯ СЕКЦИЯ: Сравнительный анализ всех экспериментов Сводная таблица результатов

results_df = DataFrame(all_results)
println("\nСводная таблица результатов:")
println(results_df[!, [:α, :final_population, :doubling_time]])

Сравнительный график всех траекторий

p2 = plot(size=(800, 500), dpi=150)
for params in all_params
data, _ = produce_or_load(
datadir(script_name, "parametric_scan"),
params,
run_single_experiment,
prefix = "scan"
) # Загружаем данные (они уже есть на диске)
plot!(p2, data["time_points"], data["population_values"],
label="α = $(params[:α])",
lw=2,
alpha=0.8
)
end
plot!(p2,
xlabel="Время, t",
ylabel="Популяция, u(t)",
title="Параметрическое исследование: влияние α на рост",
legend=:topleft,
grid=true
)

Сохраним график в папку plots

savefig(plotsdir(script_name, "parametric_scan_comparison.png"))

График зависимости времени удвоения от α

p3 = plot(results_df.α, results_df.doubling_time,
seriestype=:scatter,
label="Численное решение",
xlabel="Скорость роста, α",
ylabel="Время удвоения, t₂",
title="Зависимость времени удвоения от α",
markersize=8,
markercolor=:red,
legend=:topright
)

Теоретическая кривая: t₂ = ln(2)/α

α_range = 0.1:0.01:1.0
plot!(p3, α_range, log(2) ./ α_range,
label="Теория: t₂ = ln(2)/α",
lw=2,
linestyle=:dash,
linecolor=:blue
)

Сохраним график в папку plots

savefig(plotsdir(script_name, "doubling_time_vs_alpha.png"))

Бенчмаркинг с разными параметрами

ИЗМЕНЕНИЕ: Бенчмаркинг для разных значений α

println("\n" * "="^60)
println("Бенчмаркинг для разных значений α")
println("="^60)
benchmark_results = []
for α_value in param_grid[:α]
bench_params = Dict(
:u0 => [1.0],
:α => α_value,
:tspan => (0.0, 10.0),
:solver => Tsit5(),
:saveat => 0.1
) # Подготавливаем параметры для бенчмарка
function benchmark_run() # Функция для бенчмарка
prob = ODEProblem(exponential_growth!,
bench_params[:u0],
bench_params[:tspan],
=bench_params[:α],))
return solve(prob, bench_params[:solver];
saveat=bench_params[:saveat])
end
println("\nБенчмарк для α = $α_value:")
b = @benchmark $benchmark_run() samples=100 evals=1 # Запуск
бенчмарка
push!(benchmark_results, (α=α_value, time=median(b).time/1e9)) #
время в секундах
println(" Среднее время: ", round(median(b).time/1e9;
digits=4), " сек")
end

График зависимости времени вычисления от α

bench_df = DataFrame(benchmark_results)
p4 = plot(bench_df.α, bench_df.time,
seriestype=:scatter,
label="Время вычисления",
xlabel="Скорость роста, α",
ylabel="Время вычисления, сек",
title="Зависимость времени вычисления от α",
markersize=8,
markercolor=:green,
legend=:topleft
)

Сохраним график в папку plots

savefig(plotsdir(script_name, "computation_time_vs_alpha.png"))

Сохранение всех результатов

НОВАЯ СЕКЦИЯ: Сохранение сводных данных для последующего

 анализа
@save datadir(script_name, "all_results.jld2") base_params
 param_grid all_params results_df bench_df
@save datadir(script_name, "all_plots.jld2") p1 p2 p3 p4
println("\n" * "="^60)
println("ЛАБОРАТОРНАЯ РАБОТА ЗАВЕРШЕНА")
println("="^60)
println("\nРезультаты сохранены в:")
println(" • data/$(script_name)/single/ - базовый
 эксперимент")
println(" • data/$(script_name)/parametric_scan/ -
 параметрическое сканирование")
println(" • data/$(script_name)/all_results.jld2 - сводные
 данные")
println(" • plots/$(script_name)/ - все графики")
println(" • data/$(script_name)/all_plots.jld2 - объекты
графиков")
println("\nДля анализа результатов используйте:")
println(" using JLD2, DataFrames")
println(" @load \"data/$(script_name)/all_results.jld2\"")
println(" println(results_df)")

Анализ результатов

Заключение


### Конфигурация `_quarto.yml`

```yaml
project:
  title: "Отчёт по лабораторной работе"
  author: "Алина Тарасова"

engine: julia
julia:
  exeflags: ["--project=../labs/lab01/project"]

format:
  html:
    toc: true
    code-fold: false

Компиляция отчёта

cd ~/work/study/2026-1/2026-1==study--simulation-modeling/report
quarto render report.qmd --to html
explorer.exe report.html

Готовый отчёт

Результаты выполнения работы

Выполненные задачи

Настройка окружения

Git настроен и сконфигурирован
SSH и PGP ключи созданы и добавлены на GitHub
Git-flow инициализирован, создан первый релиз v1.0.0
Создано рабочее пространство по стандарту Denote

Установка ПО

Julia и необходимые пакеты (30 минут установки)
Quarto для создания отчётов и презентаций
Jupyter для интерактивной работы
Инструменты для Conventional Commits

Реализация моделей

Базовая модель экспоненциального роста
Параметрическое исследование (5 значений α)
Бенчмаркинг производительности

Документирование

Литературное программирование с Literate.jl
Jupyter notebooks Отчёт в Quarto (HTML) Презентация в формате reveal.js

Полученные результаты

Математические результаты

  • Подтверждена аналитическая зависимость \(u(t) = u_0 e^{\alpha t}\)
  • Экспериментально验证ено время удвоения \(T_2 = \ln(2)/\alpha\)
  • Погрешность численного решения: 0.0% (в пределах машинной точности)

Методологические результаты

  • Освоен фреймворк DrWatson.jl для организации проектов
  • Применена методология литературного программирования
  • Настроен непрерывный процесс “код → данные → отчёт”

Выводы и рекомендации

Основные выводы

  1. Модель экспоненциального роста адекватно описывает процессы с постоянной скоростью роста и имеет простое аналитическое решение

  2. Время удвоения обратно пропорционально скорости роста: \[ T_2 = \frac{\ln 2}{\alpha} \]

  3. DrWatson.jl обеспечивает:

    • Воспроизводимость исследований
    • Удобное управление параметрами
    • Автоматическое сохранение результатов
  4. Literate.jl позволяет создавать самодокументируемый код, объединяя документацию и исполняемые скрипты

  5. Quarto интегрирует код, результаты и текст в единый отчёт с возможностью экспорта в различные форматы

  6. WSL Ubuntu предоставляет удобную среду для научных вычислений с доступом к инструментам Windows

Рекомендации

Для дальнейших исследований

  • Исследовать логистическую модель роста (с ограничением ресурсов)
  • Реализовать стохастическую версию модели
  • Применить методологию к другим моделям (SIR, Лотки-Вольтерры)

Для организации работы

  • Использовать Git-flow для управления версиями
  • Применять Conventional Commits для автоматической генерации changelog
  • Регулярно запускать tangle.jl для обновления отчётов при изменении кода

Использованные технологии

Программное обеспечение

Инструмент Версия Назначение
Julia 1.10.5 Язык программирования
DifferentialEquations.jl 7.12.0 Решение ОДУ
Plots.jl 1.40.0 Визуализация
DrWatson.jl 2.15.0 Организация проектов
Literate.jl 2.16.0 Литературное программирование
Quarto 1.6.42 Создание отчётов и презентаций
Git 2.43.0 Контроль версий
Ubuntu 22.04 LTS (WSL) Операционная система

Инструкция по воспроизведению

Клонирование репозитория

git clone git@github.com:aatarasovaa/2026-1--study--simulation-modeling.git
cd 2026-1--study--simulation-modeling/labs/lab01/project

Установка зависимостей

julia --project=. -e "using Pkg; Pkg.instantiate()"

Запуск моделей

# Базовая модель
julia --project=. scripts/01_exponential_growth.jl

# Параметрическое исследование
julia --project=. scripts/02_exponential_growth.jl

Генерация отчёта

cd ../../../report
quarto render report.qmd --to html

Генерация презентации

cd ../presentation
quarto render simulation-modeling-lab01-presentation.qmd --to revealjs

Спасибо за внимание!

Контактная информация

Алина Тарасова

Репозиторий работы

git clone https://github.com/aatarasovaa/2026-1--study--simulation-modeling.git

Приложение: Основные команды Git-flow

Работа с функциональными ветками

# Создание новой функциональной ветки
git flow feature start <feature-name>

# Завершение работы над функцией
git flow feature finish <feature-name>

Работа с релизами

# Создание релиза
git flow release start <version>
standard-version
git flow release finish <version>

Работа с исправлениями

# Создание hotfix
git flow hotfix start <version>
git flow hotfix finish <version>

Приложение: Структура YAML для презентации

---
## Author
author:
  name: Алина Тарасова
  degrees: студент
  email: destinyshesaid@yandex.ru
  affiliation:
    - name: Российский университет дружбы народов
      country: Российская Федерация
      postal-code: 117198
      city: Москва
      address: ул. Миклухо-Маклая, д. 6

## Title
title: Лабораторная работа №1
subtitle: Подготовка стенда и модель экспоненциального роста
license: CC BY
date: today
date-format: "YYYY-MM-DD"

## Format
format:
  revealjs:
    theme: solarized
    transition: slide
    slide-number: true
    width: 1200
    height: 800
    footer: "Имитационное моделирование | РУДН"
---